/* 打家劫舍
    你是一个专业的小偷，计划偷窃沿街的房屋。
    每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统
    如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组，计算你不触动警报装置的情况下，一夜之内能够偷窃到的最高金额。
示例 1：
输入：[1,2,3,1]
输出：4
解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2：
输入：[2,7,9,3,1]
输出：12
解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 
*/
#include <iostream>
#include <vector>

using namespace std;

int rob(vector<int>& nums)
{
    // 没有房屋
    if (nums.size() == 0) 
    {
        return 0;
    }

    // 只有一个房屋
    if (nums.size() == 1)
    {
        return nums[0];
    }

    // 初始化 dp 数组
    vector<int> dp(nums.size(), 0);
    dp[0] = nums[0];  // 偷第一个房屋
    dp[1] = max(nums[0], nums[1]);  // 偷第一个或第二个房屋

    for (int i = 2; i < nums.size(); i++)
    {
        dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
    }

    return dp[nums.size()-1];
}

int main()
{
    vector<int> nums = {1, 2, 3, 1};
    cout << "最大可偷窃金额: " << rob(nums) << endl;

    return 0;
}